home *** CD-ROM | disk | FTP | other *** search
/ Aminet 40 / Aminet 40 (2000)(Schatztruhe)[!][Dec 2000].iso / Aminet / misc / emu / ATUtilities.lha / ATUtilities / new.c < prev    next >
C/C++ Source or Header  |  2000-09-26  |  47KB  |  1,996 lines

  1. /* ******************************************************************* */
  2. /* **                                                               ** */
  3. /* **                     ATUtilities Online Help                   ** */
  4. /* **            Copright (C) 1992-1993 by Thomas Dreibholz         ** */
  5. /* **                      All rights reserved                      ** */
  6. /* **                                                               ** */
  7. /* ******************************************************************* */
  8.  
  9. #define PAGE_INDEX 1
  10. #define PAGE_TEXT  2
  11.  
  12. #define PAGE_MEMORY 199
  13.  
  14. #include "ATUtilities.h"
  15. /*
  16. #define CreateBoolGadget(win,x,y,w,h,text,id) CreateBoolToggleGadget(0,win,x,y,w,h,text,id)
  17. #define CreateMinGadget(win,x,y,w,h,id) CreateBoolToggleGadget(4,win,x,y,w,h,0L,id)
  18. */
  19. extern struct Library *DiskfontBase;
  20.  
  21. /* feste Strukturen */
  22. UBYTE *HelpName="SYS:PC/ATUtilities/OnlineHelp.prefs";
  23.  
  24. struct TextAttr Opal=
  25. {
  26.  "opal.font",
  27.  9,
  28.  FS_NORMAL,
  29.  FPF_DISKFONT
  30. };
  31.  
  32. struct OHPrefs
  33. {
  34.  UBYTE Cache;
  35.  UBYTE Numbers;
  36.  UBYTE NumInput;
  37.  UBYTE PAL;
  38. };
  39.  
  40. struct Page
  41. {
  42.  UWORD Length;
  43.  UWORD Flags;
  44.  ULONG Offset;
  45.  ULONG TextOffset;
  46.  ULONG GadgetOffset;
  47.  ULONG PictureOffset;
  48. };
  49.  
  50. struct Pages
  51. {
  52.  struct Page Page[1000];
  53. };
  54.  
  55. #define POFFSET(x) hd->Pages->Page[x].PictureOffset
  56. #define GOFFSET(x) hd->Pages->Page[x].GadgetOffset
  57. #define TOFFSET(x) hd->Pages->Page[x].TextOffset
  58. #define OFFSET(x) hd->Pages->Page[x].Offset
  59. #define LENGTH(x) hd->Pages->Page[x].Length
  60. #define FLAGS(x) hd->Pages->Page[x].Flags
  61.  
  62. struct HelpData
  63. {
  64.  struct OHPrefs     OHPrefs;
  65.  struct Screen     *Screen;
  66.  struct Window     *MainWindow;
  67.  struct Window     *IndexWindow;
  68.  struct Window     *TextWindow;
  69.  struct MenuStrip  *MenuStrip;
  70.  struct Menu       *DateiMenu;
  71.  struct Menu       *QVMenu;
  72.  struct Menu       *BilderMenu;
  73.  struct Window     *GadWindow;
  74.  struct Gadget     *PropGadget;
  75.  struct PropInfo   *PropInfo;
  76.  struct RastPort   *MainRastPort;
  77.  struct RastPort   *IndexRastPort;
  78.  struct MsgPort    *MainUserPort;
  79.  struct MsgPort    *IndexUserPort;
  80.  struct MsgPort    *TextUserPort;
  81.  struct MsgPort    *GadUserPort;
  82.  struct TextFont   *OpalFont;
  83.  struct ViewPort   *ViewPort;
  84.  struct MsgPort    *ConPort;
  85.  struct IOStdReq   *ConReq;
  86.  LONG               ConDev;
  87.  struct FileHandle *HelpFile;
  88.  UBYTE             *Memory;
  89.  struct Pages      *Pages;
  90.  ULONG              Picture[100];
  91.  UWORD              Page;
  92.  UWORD              Flags;
  93.  ULONG              MainWindowSM;
  94.  ULONG              IndexWindowSM;
  95.  ULONG              TextWindowSM;
  96.  ULONG              GadWindowSM;
  97.  ULONG              WaitSM;
  98.  UWORD              NextPage[4];
  99.  
  100.  UWORD              LastPage[PAGE_MEMORY+1];
  101.  UBYTE              LastPagePos;
  102.  UBYTE              LastPageSelect;
  103.  UWORD              ShowLastPageBack;
  104.  
  105.  UBYTE              String[200];
  106.  
  107.  BOOL               NTSC;
  108.  UWORD              Rows;
  109.  UWORD              MaxItems;
  110.  
  111.  UWORD              PropDown;
  112.  
  113.  UWORD              CacheOn;
  114.  ULONG              CacheSize;
  115.  LONG               CachePos;
  116.  LONG               CacheLastPos;
  117.  UBYTE             *CacheMemory;
  118.  
  119.  UBYTE              InputCount;
  120.  UWORD              Input[3];
  121.  
  122.  UWORD              IGy;
  123.  UWORD              IGw;
  124.  UWORD              IGs;
  125.  UWORD              IGPCount;
  126.  struct Gadget     *IndexGadgets[64];
  127.  UWORD              IndexGadgetPages[64];
  128.  
  129.  UWORD              MenuPageCount;
  130.  UWORD              MenuNames[25][70];
  131.  UWORD              MenuPages[25];
  132.  
  133.  UBYTE              MenuPicCount;
  134.  UBYTE              MenuPicNames[25][16];
  135.  UBYTE              MenuPics[25];
  136.  
  137.  UWORD              PropBody;
  138.  UWORD              LineCount;
  139.  UWORD              CurrentLine;
  140.  UBYTE             *Lines[2000];
  141. }; 
  142.  
  143. UWORD Colors[]={0x97a,0x222,0xddd,0xff5,0xdd6,0xccc,0xfff,0x22f};
  144.  
  145. BOOL OpenHelp();
  146. VOID CloseHelp();
  147. VOID ConWrite();
  148. VOID RefreshGadWindow();
  149. VOID GetTitle();
  150. VOID LoadPage();
  151. VOID ShowIndexPage();
  152. VOID ShowTextPage();
  153. VOID RemIndexGadgets();
  154. VOID NewProp();
  155. VOID ShowPart();
  156. VOID MakeMenu();
  157. VOID Hinweise();
  158. VOID GetPictures();
  159. VOID Prefs();
  160. LONG CacheRead();
  161. LONG CacheSeek();
  162. VOID LoadAPicture();
  163. VOID AddPage();
  164.  
  165. BOOL ShowPicture();
  166. BOOL DisplayPicture();
  167. UBYTE *GetOpalLine();
  168. UBYTE *GetOpalLine450();
  169. VOID RemoveMenuStrip();
  170. VOID UseMenuStrip();
  171. UBYTE MouseButton();
  172. struct MenuStrip *BuildMenuStrip();
  173. struct Menu      *AddMenu();
  174. struct Menu      *AddItem();
  175.  
  176.  
  177. /* Informationen anzeigen */
  178. VOID ShowInfo(win,scr)
  179.  struct Window *win;
  180.  struct Screen *scr;
  181. {
  182.  WBenchToFront();
  183.  InformationBox("ATUtilities Online Help - Information",
  184.                 "Online Help - Version 2.0",
  185.                 "Copyright (C) 1993 by",
  186.                 "Thomas Dreibholz",
  187.                 "All rights reserved.",
  188.                 "SYS:PC/ATUtilities/Icons/Help");
  189.  ScreenToFront(scr);
  190.  ActivateWindow(win);
  191. }
  192.  
  193.  
  194. /* Online-Hilfe-Funktion */
  195. VOID Help(name,seite)
  196.  UBYTE *name;
  197.  UWORD  seite;
  198. {
  199.  UBYTE                         s[32];
  200.  REGISTER ULONG                Class;
  201.  REGISTER BOOL                 ende,bool;
  202.  REGISTER UWORD                i,j,Code;
  203.  REGISTER UWORD                MenuNum,ItemNum;
  204.  REGISTER ULONG                Signale;
  205.  register struct IntuiMessage *msg;
  206.  register struct HelpData     *hd;
  207.  register struct Gadget       *gad;
  208.  
  209.  if(DiskfontBase==NULL)
  210.   {
  211.    InfoRequest("Keine Diskfont-Library!");
  212.    return;
  213.   }
  214.  
  215.  hd=AllocMem(sizeof(struct HelpData),MEMF_CLEAR|MEMF_PUBLIC);
  216.  if(hd==NULL)
  217.   {
  218.    ErrorRequest(ERROR_ALLOC);
  219.    return;
  220.   }
  221.  
  222.  bool=OpenHelp(hd,name);
  223.  if(bool==TRUE)
  224.   {
  225.    ende=FALSE;
  226.    while(ende==FALSE)
  227.     {
  228.      Signale=Wait(hd->WaitSM);
  229.      if((hd->GadUserPort!=NULL) && (Signale & hd->GadWindowSM))
  230.       {
  231.        msg=GetMsg(hd->GadUserPort);
  232.        while(msg!=NULL)
  233.         {
  234.          Class=msg->Class;
  235.          gad=msg->IAddress;
  236.          ReplyMsg(msg);
  237.          if(Class==GADGETUP)
  238.           {
  239.            j=gad->GadgetID;
  240.            switch(j)
  241.             {
  242.              case 1000:
  243.                if(hd->LastPageSelect>0)
  244.                 {
  245.                  hd->LastPageSelect--;
  246.                  hd->ShowLastPageBack++;
  247.                  LoadPage(hd,hd->LastPage[hd->LastPageSelect],FALSE);
  248.                 }
  249.               break;
  250.              case 2000:
  251.                if(hd->ShowLastPageBack>0)
  252.                 {
  253.                  hd->ShowLastPageBack--;
  254.                  hd->LastPageSelect++;
  255.                  LoadPage(hd,hd->LastPage[hd->LastPageSelect],FALSE);
  256.                 }
  257.               break;
  258.              default:
  259.                LoadPage(hd,hd->NextPage[j],TRUE);
  260.               break;
  261.             }
  262.           }
  263.          else if(Class==ACTIVEWINDOW)
  264.            ActivateWindow(hd->MainWindow);
  265.          msg=GetMsg(hd->GadUserPort);
  266.         }
  267.       }
  268.      if(Signale & hd->MainWindowSM)
  269.       {
  270.        msg=GetMsg(hd->MainUserPort);
  271.        while(msg!=NULL)
  272.         {
  273.          Class=msg->Class;
  274.          Code=msg->Code;
  275.          gad=msg->IAddress;
  276.          ReplyMsg(msg);
  277.          switch(Class)
  278.           {
  279.            case GADGETUP:
  280.             j=gad->GadgetID;
  281.             switch(j)
  282.              {
  283.               case 1:
  284.                 ende=TRUE;
  285.                break;
  286.               case 2:
  287.                 LoadPage(hd,0,TRUE);
  288.                break;
  289.               case 3:
  290.                 if((hd->Flags==PAGE_TEXT)&&(hd->LineCount>hd->Rows))
  291.                  {
  292.                   hd->PropDown=0;
  293.                   j=hd->PropInfo->VertPot/(65535/hd->PropBody);
  294.                   ShowPart(hd,j);
  295.                  }
  296.                break;
  297.              }
  298.             break;
  299.            case GADGETDOWN:
  300.             j=gad->GadgetID;
  301.             switch(j)
  302.              {
  303.               case 3:
  304.                 if((hd->Flags==PAGE_TEXT)&&(hd->LineCount>hd->Rows))
  305.                  {
  306.                   hd->PropDown=1;
  307.                  }
  308.                break;
  309.              }
  310.             break;
  311.            case MOUSEMOVE:
  312.              if(hd->PropDown!=0)
  313.               {
  314.                AbortIO(hd->ConReq);
  315.                j=hd->PropInfo->VertPot/(65535/hd->PropBody);
  316.                ShowPart(hd,j);
  317.               }
  318.             break;
  319.            case MENUPICK:
  320.              MenuNum=MENUNUM(Code);
  321.              ItemNum=ITEMNUM(Code);
  322.              switch(MenuNum)
  323.               {
  324.                case 2:
  325.                  switch(ItemNum)
  326.                   {
  327.                    case 0:
  328.                      ende=TRUE;
  329.                     break;
  330.                    case 2:
  331.                      ShowInfo(hd->MainWindow,hd->Screen);
  332.                     break;
  333.                    case 3:
  334.                      Hinweise(hd);
  335.                     break;
  336.                    case 4:
  337.                      Prefs(hd);
  338.                     break;
  339.                   }
  340.                 break;
  341.                case 1:
  342.                  if(hd->Flags==PAGE_TEXT)
  343.                   {
  344.                    if((hd->MenuPageCount!=0)&&(ItemNum<=hd->MenuPageCount))
  345.                      LoadPage(hd,hd->MenuPages[hd->MenuPageCount-ItemNum-1],TRUE);
  346.                   }
  347.                 break;
  348.                case 0:
  349.                  if((hd->MenuPicCount!=0)&&(ItemNum<=hd->MenuPicCount))
  350.                    LoadAPicture(hd,hd->MenuPics[hd->MenuPicCount-ItemNum-1]);
  351.                  ActivateWindow(hd->MainWindow);
  352.                 break;
  353.               }
  354.             break;
  355.            case VANILLAKEY:
  356.              if(hd->OHPrefs.NumInput)
  357.               {
  358.                if((Code>='0')&&(Code<='9'))
  359.                 {
  360.                  hd->Input[hd->InputCount]=Code;
  361.                  hd->InputCount++;
  362.                  sprintf(&s,"Seiteneingabe: #%c%c%c",hd->Input[0],
  363.                                                      hd->Input[1],
  364.                                                      hd->Input[2]);
  365.                  DrawCNTextBorder(hd->MainWindow,320,10,310,12,&s);
  366.                  if(hd->InputCount>2)
  367.                   {
  368.                    LoadPage(hd,(hd->Input[0]-48)*100+
  369.                                (hd->Input[1]-48)*10+
  370.                                (hd->Input[2]-48),TRUE);
  371.                   }
  372.                 }
  373.               }
  374.             break;
  375.           }
  376.          msg=GetMsg(hd->MainUserPort);
  377.         }
  378.       }
  379.      if(Signale & hd->IndexWindowSM)
  380.       {
  381.        msg=GetMsg(hd->IndexUserPort);
  382.        while(msg!=NULL)
  383.         {
  384.          Class=msg->Class;
  385.          gad=msg->IAddress;
  386.          ReplyMsg(msg);
  387.          if(Class==GADGETUP)
  388.           {
  389.            j=gad->GadgetID;
  390.            LoadPage(hd,hd->IndexGadgetPages[j],TRUE);
  391.           }
  392.          else if(Class==ACTIVEWINDOW)
  393.            ActivateWindow(hd->MainWindow);
  394.          msg=GetMsg(hd->IndexUserPort);
  395.         }
  396.       }
  397.      if(Signale & hd->TextWindowSM)
  398.       {
  399.        msg=GetMsg(hd->TextUserPort);
  400.        while(msg!=NULL)
  401.         {
  402.          Class=msg->Class;
  403.          ReplyMsg(msg);
  404.          if(Class==ACTIVEWINDOW)
  405.            ActivateWindow(hd->MainWindow);
  406.          msg=GetMsg(hd->TextUserPort);
  407.         }
  408.       }
  409.     }
  410.   }
  411.  CloseHelp(hd);
  412.  FreeMem(hd,sizeof(struct HelpData));
  413. }
  414.  
  415.  
  416. BOOL OpenHelp(hd,name)
  417.  struct HelpData *hd;
  418.  UBYTE           *name;
  419. {
  420.  register struct FileHandle *fh;
  421.  UBYTE                       c;
  422.  WORD                        a,i;
  423.  LONG                        b;
  424.  static struct NewScreen HelpScreen=
  425.   {
  426.    0,0,640,256,3,
  427.    0,1,
  428.    HIRES,
  429.    CUSTOMSCREEN,
  430.    NULL,
  431.    NULL,NULL,NULL
  432.   };
  433.  static struct NewWindow MainWindowDef=
  434.   {
  435.    0,0,640,256,
  436.    0,2,
  437.    GADGETUP|MENUPICK|GADGETDOWN|MOUSEMOVE|VANILLAKEY,
  438.    ACTIVATE|BORDERLESS,
  439.    NULL,NULL,NULL,NULL,NULL,
  440.    10,16,640,256,
  441.    CUSTOMSCREEN
  442.   };
  443.  static struct NewWindow IndexWindowDef=
  444.   {
  445.    11,26,582,210,
  446.    0,1,
  447.    GADGETUP|ACTIVEWINDOW,
  448.    BORDERLESS,
  449.    NULL,NULL,NULL,NULL,NULL,
  450.    10,16,640,256,
  451.    CUSTOMSCREEN
  452.   };
  453.  static struct NewWindow TextWindowDef=
  454.   {
  455.    12,27,580,208,
  456.    0,1,
  457.    ACTIVEWINDOW,
  458.    NOCAREREFRESH|BORDERLESS,
  459.    NULL,NULL,NULL,NULL,NULL,
  460.    10,16,640,256,
  461.    CUSTOMSCREEN
  462.   };
  463.  
  464.  hd->ConDev=-1L;
  465.  
  466.  hd->HelpFile=Open(name,MODE_OLDFILE);
  467.  if(hd->HelpFile==NULL)
  468.   {
  469.    MultiRequest("Kann Hilfedatei nicht öffnen:",name,"Okay",NULL);
  470.    return(FALSE);
  471.   }
  472.  
  473.  hd->OpalFont=GetOpalFont();
  474.  if(hd->OpalFont==NULL)
  475.   {
  476.    InfoRequest("Opal-Font fehlt!");
  477.    return(FALSE);
  478.   }
  479.  
  480.  fh=Open(HelpName,MODE_OLDFILE);
  481.  if(fh!=NULL)
  482.   {
  483.    Read(fh,&hd->OHPrefs,sizeof(struct OHPrefs));
  484.    Close(fh);
  485.   }
  486.  
  487.  if(hd->OHPrefs.PAL==0)
  488.   {
  489.    hd->NTSC=TRUE;
  490.    hd->Rows=18;
  491.    hd->MaxItems=18;
  492.    HelpScreen.Height=200;
  493.    MainWindowDef.Height=200;
  494.    IndexWindowDef.Height=154;
  495.    TextWindowDef.Height=152;
  496.   }
  497.  else
  498.   {
  499.    hd->NTSC=FALSE;
  500.    hd->Rows=25;
  501.    hd->MaxItems=24;
  502.   }
  503.  
  504.  hd->Screen=OpenScreen(&HelpScreen);
  505.  if(hd->Screen==NULL)
  506.   {
  507.    InfoRequest("Kann Screen nicht öffnen!");
  508.    return(FALSE);
  509.   }
  510.  
  511.  hd->ViewPort=&hd->Screen->ViewPort;
  512.  LoadRGB4(hd->ViewPort,&Colors,8);
  513.  
  514.  MainWindowDef.Screen=hd->Screen;
  515.  IndexWindowDef.Screen=hd->Screen;
  516.  TextWindowDef.Screen=hd->Screen;
  517.  
  518.  hd->IndexWindow=OpenWindow(&IndexWindowDef);
  519.  if(hd->IndexWindow==NULL)
  520.   {
  521.    InfoRequest("Kann Fenster nicht öffnen!");
  522.    return(FALSE);
  523.   }
  524.  
  525.  hd->TextWindow=OpenWindow(&TextWindowDef);
  526.  if(hd->TextWindow==NULL)
  527.   {
  528.    InfoRequest("Kann Fenster nicht öffnen!");
  529.    return(FALSE);
  530.   }
  531.  
  532.  hd->MainWindow=OpenWindow(&MainWindowDef);
  533.  if(hd->MainWindow==NULL)
  534.   {
  535.    InfoRequest("Kann Fenster nicht öffnen!");
  536.    return(FALSE);
  537.   }
  538.  
  539.  hd->MainRastPort=hd->MainWindow->RPort;
  540.  hd->IndexRastPort=hd->IndexWindow->RPort;
  541.  hd->MainUserPort=hd->MainWindow->UserPort;
  542.  hd->IndexUserPort=hd->IndexWindow->UserPort;
  543.  hd->TextUserPort=hd->TextWindow->UserPort;
  544.  hd->MainWindowSM=(1L<<hd->MainUserPort->mp_SigBit);
  545.  hd->IndexWindowSM=(1L<<hd->IndexUserPort->mp_SigBit);
  546.  hd->TextWindowSM=(1L<<hd->TextUserPort->mp_SigBit);
  547.  hd->MainWindow->UserData=NULL;
  548.  hd->IndexWindow->UserData=NULL;
  549.  hd->TextWindow->UserData=NULL;
  550.  
  551.  SetFont(hd->MainRastPort,hd->OpalFont);
  552.  SetFont(hd->IndexRastPort,hd->OpalFont);
  553.  
  554.  CreateBoolGadget(hd->MainWindow,10,10,150,12,"Ende",1);
  555.  CreateBoolGadget(hd->MainWindow,165,10,150,12,"Index",2);
  556.  if(hd->NTSC==FALSE) i=211; else i=155;
  557.  hd->PropGadget=CreatePropGadget(hd->MainWindow,600,25,30,i,0,0,0,(65535/10),3);
  558.  hd->PropInfo=hd->PropGadget->SpecialInfo;
  559.  DrawNBorder(hd->MainWindow,10,25,584,i);
  560.  
  561.  SetAPen(hd->MainRastPort,3);
  562.  WriteText(hd->MainRastPort,40,40,"ATUtilities Online-Hilfe - Version 2.0");
  563.  WriteText(hd->MainRastPort,40,60,"Hilfedatei wird bearbeitet.");
  564.  WriteText(hd->MainRastPort,40,80,"Bitte warten...");
  565.  
  566.  hd->ConPort=CreatePort("onlinehelp-console.port",0L);
  567.  if(hd->ConPort==NULL)
  568.   {
  569.    InfoRequest("Kann MsgPort nicht erstellen!");
  570.    return(FALSE);
  571.   }
  572.  
  573.  hd->ConReq=CreateExtIO(hd->ConPort,sizeof(struct IOStdReq));
  574.  if(hd->ConReq==NULL)
  575.   {
  576.    InfoRequest("Kann IOStdReq nicht erstellen!");
  577.    return(FALSE);
  578.   }
  579.  
  580.  hd->ConReq->io_Data=hd->TextWindow;
  581.  hd->ConReq->io_Length=sizeof(struct Window);
  582.  
  583.  hd->ConDev=OpenDevice("console.device",0L,hd->ConReq,0L);
  584.  if(hd->ConDev!=0)
  585.   {
  586.    InfoRequest("Kann Console-Device nicht öffnen!");
  587.    return(FALSE);
  588.   }
  589.  
  590.  ConWrite(hd,"\x9b");
  591.  ConWrite(hd,"0;33;40m");
  592.  
  593.  if(hd->OHPrefs.Cache!=0)
  594.   {
  595.    Seek(hd->HelpFile,0,OFFSET_END);
  596.    hd->CacheSize=Seek(hd->HelpFile,0,OFFSET_BEGINNING);
  597.    hd->CacheMemory=AllocMem(hd->CacheSize,MEMF_CLEAR|MEMF_PUBLIC);
  598.    if(hd->CacheMemory!=NULL)
  599.     {
  600.      b=Read(hd->HelpFile,hd->CacheMemory,hd->CacheSize);
  601.      if(b==hd->CacheSize) hd->CacheOn=1;
  602.     }
  603.   }
  604.  
  605.  hd->Pages=AllocMem(sizeof(struct Pages),MEMF_CLEAR|MEMF_PUBLIC);
  606.  if(hd->Pages==NULL)
  607.   {
  608.    ErrorRequest(ERROR_ALLOC);
  609.    return(FALSE);
  610.   }
  611.  
  612.  hd->Memory=AllocMem(50000,MEMF_CLEAR|MEMF_PUBLIC);
  613.  if(hd->Memory==NULL)
  614.   {
  615.    ErrorRequest(ERROR_ALLOC);
  616.    return(FALSE);
  617.   }
  618.  
  619.  CacheSeek(hd,-4,OFFSET_END);
  620.  CacheRead(hd,&b,4L);
  621.  CacheSeek(hd,b,OFFSET_BEGINNING);
  622.  for(i=0;i<1000;i++)
  623.   {
  624.    CacheRead(hd,&c,1L);
  625.    if(c!=0)
  626.     {
  627.      CacheRead(hd,&a,2L);
  628.      CacheRead(hd,&b,4L);
  629.      LENGTH(i)=a;
  630.      OFFSET(i)=b;
  631.      FLAGS(i)=c;
  632.      CacheRead(hd,&b,4L);
  633.      TOFFSET(i)=b;
  634.      CacheRead(hd,&b,4L);
  635.      GOFFSET(i)=b;
  636.      CacheRead(hd,&b,4L);
  637.      POFFSET(i)=b;
  638.     }
  639.   }
  640.  for(i=0;i<100;i++)
  641.   {
  642.    CacheRead(hd,&hd->Picture[i],4L);
  643.   }
  644.  
  645.  hd->MenuStrip=BuildMenuStrip(hd->MainWindow,7,AUTOBACKPEN);
  646.  if(hd->MenuStrip==NULL)
  647.   {
  648.    InfoRequest("Kein Speicher für Menu!");
  649.    return(FALSE);
  650.   }
  651.  
  652.  hd->Page=12345;
  653.  LoadPage(hd,0,TRUE);
  654.  return(TRUE);
  655. }
  656.  
  657.  
  658. VOID CloseHelp(hd)
  659.  struct HelpData *hd;
  660. {
  661.  
  662.  if(hd->MenuStrip) RemoveMenuStrip(hd->MenuStrip,TRUE);
  663.  if(hd->ConDev==0) CloseDevice(hd->ConReq);
  664.  if(hd->GadWindow) DeleteStdWindow(hd->GadWindow);
  665.  if(hd->TextWindow) DeleteStdWindow(hd->TextWindow);
  666.  if(hd->IndexWindow)
  667.   {
  668.    RemIndexGadgets(hd);
  669.    DeleteStdWindow(hd->IndexWindow);
  670.   }
  671.  if(hd->MainWindow) DeleteStdWindow(hd->MainWindow);
  672.  if(hd->Screen) CloseScreen(hd->Screen);
  673.  if(hd->ConReq) DeleteExtIO(hd->ConReq);
  674.  if(hd->ConPort) DeletePort(hd->ConPort);
  675.  if(hd->Pages) FreeMem(hd->Pages,sizeof(struct Pages));
  676.  if(hd->Memory) FreeMem(hd->Memory,50000);
  677.  if(hd->CacheMemory) FreeMem(hd->CacheMemory,hd->CacheSize);
  678.  if(hd->OpalFont) CloseFont(hd->OpalFont);
  679.  if(hd->HelpFile) Close(hd->HelpFile);
  680. }
  681.  
  682.  
  683. VOID ConWrite(hd,text)
  684.  struct HelpData *hd;
  685.  UBYTE           *text;
  686. {
  687.  hd->ConReq->io_Data=text;
  688.  hd->ConReq->io_Length=strlen(text);
  689.  hd->ConReq->io_Command=CMD_WRITE;
  690.  SendIO(hd->ConReq);
  691. }
  692.  
  693.  
  694. VOID RefreshGadWindow(hd)
  695.  struct HelpData *hd;
  696. {
  697.  WORD i;
  698.  static struct NewWindow GadWindowDef=
  699.   {
  700.    0,238,640,15,
  701.    0,1,
  702.    GADGETUP|ACTIVEWINDOW,
  703.    BORDERLESS,
  704.    NULL,NULL,NULL,NULL,NULL,
  705.    10,10,640,256,
  706.    CUSTOMSCREEN
  707.   };
  708.  
  709.  if(hd->NTSC==TRUE) GadWindowDef.TopEdge=182;
  710.  if(hd->GadWindow!=NULL)
  711.    DeleteStdWindow(hd->GadWindow);
  712.  GetTitle(hd,hd->Page);
  713.  DrawMNTextBorder(hd->MainWindow,320,10,310,12,hd->Memory);
  714.  
  715.  GadWindowDef.Screen=hd->Screen;
  716.  hd->GadWindow=OpenWindow(&GadWindowDef);
  717.  if(hd->GadWindow!=NULL)
  718.   {
  719.    SetFont(hd->GadWindow->RPort,hd->OpalFont);
  720.    hd->GadUserPort=hd->GadWindow->UserPort;
  721.    hd->GadWindowSM=(1L<<hd->GadUserPort->mp_SigBit);
  722.    for(i=0;i<=3;i++) hd->NextPage[i]=0xFFFF;
  723.  
  724.    if(hd->Page>0)
  725.     {
  726.      for(i=(hd->Page-1);i>=0;i--)
  727.        if(FLAGS(i)==PAGE_INDEX)
  728.         { hd->NextPage[0]=i; break; }
  729.     }
  730.  
  731.    if(hd->Page!=0) hd->NextPage[3]=0;
  732.    if(hd->Page<999)
  733.     {
  734.      for(i=(hd->Page+1);i<=999;i++)
  735.        if(FLAGS(i)==PAGE_INDEX)
  736.         { hd->NextPage[3]=i; break; }
  737.     }
  738.  
  739.    if(hd->Page>0)
  740.     {
  741.      for(i=(hd->Page-1);i>=0;i--)
  742.       {
  743.        if(FLAGS(i)!=0)
  744.         {
  745.          if(FLAGS(i)==PAGE_TEXT)
  746.            hd->NextPage[1]=i;
  747.          break;
  748.         }
  749.       }
  750.     }
  751.  
  752.    if(hd->Page<999)
  753.     {
  754.      for(i=(hd->Page+1);i<=999;i++)
  755.       {
  756.        if(FLAGS(i)!=0)
  757.         {
  758.          if(FLAGS(i)==PAGE_TEXT)
  759.            hd->NextPage[2]=i;
  760.          break;
  761.         }
  762.       }
  763.     }
  764.  
  765.    for(i=0;i<=3;i++)
  766.     {
  767.      if(hd->NextPage[i]!=0xFFFF)
  768.       {
  769.        GetTitle(hd,hd->NextPage[i]);
  770.        CreateMBoolGadget(hd->GadWindow,38+(i*143),1,135,12,hd->Memory,i);
  771.       }
  772.     }
  773.    if(hd->LastPageSelect>0)
  774.      CreateBoolGadget(hd->GadWindow,10,1,22,12,"«",1000);
  775.    if(hd->ShowLastPageBack>0)
  776.      CreateBoolGadget(hd->GadWindow,608,1,22,12,"»",2000);
  777.   }
  778.  else
  779.   {
  780.    hd->GadWindowSM=0;
  781.    hd->GadUserPort=NULL;
  782.   }
  783.  hd->WaitSM=hd->GadWindowSM+hd->MainWindowSM+hd->IndexWindowSM+hd->TextWindowSM;
  784. }
  785.  
  786.  
  787. VOID GetTitle(hd,p)
  788.  struct HelpData *hd;
  789.  LONG             p;
  790.  LONG i,o;
  791.  
  792.  i=OFFSET(p);
  793.  if(i!=0)
  794.   {
  795.    o=CacheSeek(hd,i,OFFSET_BEGINNING);
  796.    if(hd->OHPrefs.Numbers==0)
  797.     {
  798.      CacheRead(hd,hd->Memory,1024L);
  799.     }
  800.    else
  801.     {
  802.      sprintf(hd->Memory,"#%03ld: ",p);
  803.      CacheRead(hd,&hd->Memory[6],1024L);
  804.     }
  805.    CacheSeek(hd,o,OFFSET_BEGINNING);
  806.   }
  807.  else hd->Memory[0]=0x00;
  808. }
  809.  
  810.  
  811. VOID LoadPage(hd,num,add)
  812.  struct HelpData *hd;
  813.  UWORD            num;
  814.  BOOL             add;
  815. {
  816.  
  817.  hd->InputCount=0;
  818.  hd->Input[1]='-';
  819.  hd->Input[2]='-';
  820.  if(num==hd->Page) return;
  821.  if(OFFSET(num)!=0)
  822.   {
  823.    hd->Page=num;
  824.    hd->Flags=FLAGS(num);
  825.    if(add==TRUE) AddPage(hd);
  826.    RemIndexGadgets(hd);
  827.    switch(hd->Flags)
  828.     {
  829.      case PAGE_INDEX:
  830.        NewProp(hd,1);
  831.        ShowIndexPage(hd,num);
  832.       break;
  833.      case PAGE_TEXT:
  834.        ShowTextPage(hd,num);
  835.       break;
  836.     }
  837.   }
  838.  else
  839.   {
  840.    DisplayBeep(hd->Screen);
  841.    DisplayBeep(hd->Screen);
  842.   }
  843. }
  844.  
  845.  
  846. VOID ShowIndexPage(hd,num)
  847.  struct HelpData *hd;
  848.  UWORD            num;
  849. {
  850.  UBYTE *m;
  851.  LONG   i,j,max;
  852.  UWORD  x,y,w,xx,yy;
  853.  UWORD  wort;
  854.  UBYTE  c;
  855.  
  856.  x=15; y=11;
  857.  j=TOFFSET(num);
  858.  if(j!=0)
  859.   {
  860.    i=LENGTH(num);
  861.    CacheSeek(hd,j,OFFSET_BEGINNING);
  862.    CacheRead(hd,hd->Memory,i);
  863.  
  864.  /* ----- Testausgabe -------------------------------------------------- */
  865.    SetAPen(hd->IndexRastPort,3);
  866.    m=hd->Memory;
  867.    for(j=0;j<i;j++)
  868.     {
  869.      c=m[j];
  870.      if(c==0x00)
  871.       {
  872.        x=15;
  873.        y+=10;
  874.       }
  875.      else
  876.       {
  877.        Move(hd->IndexRastPort,x,y);
  878.        Text(hd->IndexRastPort,&c,1L);
  879.        x=x+TextLength(hd->IndexRastPort,&c,1L);
  880.       }
  881.     }
  882.   }
  883.  
  884.  /* ----- Gadgets ------------------------------------------------------ */
  885.  j=GOFFSET(num);
  886.  if(j!=0)
  887.   {
  888.    CacheSeek(hd,j,OFFSET_BEGINNING);
  889.    j=0; y-=5;
  890.    CacheRead(hd,&wort,2L);
  891.    while((wort!=0xFFFF)&&(j<=63))
  892.     {
  893.      hd->IndexGadgetPages[j]=wort;
  894.      j++;
  895.      CacheRead(hd,&wort,2L);
  896.     }
  897.    hd->IGPCount=j;
  898.  
  899.    if(hd->NTSC==FALSE) max=198; else max=142;
  900.    hd->IGy=(max-y)/27;
  901.    hd->IGs=hd->IGPCount/hd->IGy;
  902.    hd->IGw=((552-((hd->IGs-1)*5))/hd->IGs);
  903.  
  904.    x=15;
  905.    for(i=0;i<hd->IGPCount;i++)
  906.     {
  907.      if(hd->IndexGadgetPages[i]!=2000)
  908.       {
  909.        GetTitle(hd,hd->IndexGadgetPages[i]);
  910.        hd->IndexGadgets[i]=CreateMBoolGadget(hd->IndexWindow,x,y,hd->IGw,12,hd->Memory,i);
  911.        x+=hd->IGw+5;
  912.        if(x>550) { x=15; y+=15; }
  913.       }
  914.      else
  915.       {
  916.        if(x>15)
  917.         {
  918.          x=15; y+=15;
  919.         }
  920.        y+=10;
  921.       }
  922.     }
  923.   }
  924.  else hd->IGPCount=0;
  925.  GetPictures(hd,num);
  926.  
  927.  /* ----- GadWindow öffnen --------------------------------------------- */
  928.  
  929.  WindowToFront(hd->IndexWindow);
  930.  RefreshGadWindow(hd);
  931.  MakeMenu(hd);
  932. }
  933.  
  934.  
  935. VOID GetPictures(hd,num)
  936.  struct HelpData *hd;
  937.  UWORD            num;
  938. {
  939.  UBYTE          byte;
  940.  REGISTER ULONG o;
  941.  
  942.  o=POFFSET(num);
  943.  if(o!=0)
  944.   {
  945.    CacheSeek(hd,o,OFFSET_BEGINNING);
  946.    CacheRead(hd,&byte,1L);
  947.    while((byte!=0xFF)&&(hd->MenuPicCount<=hd->MaxItems))
  948.     {
  949.      hd->MenuPics[hd->MenuPicCount]=byte;
  950.      hd->MenuPicCount++;
  951.      CacheRead(hd,&byte,1L);
  952.     }
  953.   }
  954.  else hd->MenuPicCount=0;
  955. }
  956.  
  957.  
  958. VOID ShowTextPage(hd,num)
  959.  struct HelpData *hd;
  960.  UWORD            num;
  961. {
  962.  UBYTE          *m;
  963.  UBYTE           byte;
  964.  UWORD           wort;
  965.  REGISTER UWORD  i,j,k;
  966.  REGISTER ULONG  o;
  967.  
  968.  hd->MenuPageCount=0;
  969.  o=GOFFSET(num);
  970.  if(o!=0)
  971.   {
  972.    CacheSeek(hd,o,OFFSET_BEGINNING);
  973.    CacheRead(hd,&wort,2L);
  974.    while((wort!=0xFFFF)&&(hd->MenuPageCount<=hd->MaxItems))
  975.     {
  976.      hd->MenuPages[hd->MenuPageCount]=wort;
  977.      hd->MenuPageCount++;
  978.      CacheRead(hd,&wort,2L);
  979.     }
  980.    for(j=0;j<hd->MenuPageCount;j++)
  981.     {
  982.      if(hd->MenuPages[j]!=2000)
  983.       {
  984.        GetTitle(hd,hd->MenuPages[j]);
  985.        if((strlen(hd->Memory))>60) hd->Memory[59]=0x00;
  986.        strcpy(&hd->MenuNames[j],hd->Memory);
  987.       }
  988.     }
  989.   }
  990.  else hd->MenuPageCount=0;
  991.  
  992.  GetPictures(hd,num);
  993.  MakeMenu(hd);
  994.  
  995.  RefreshGadWindow(hd);
  996.  hd->CurrentLine=0xFFFF;
  997.  hd->LineCount=0;
  998.  for(i=0;i<2000;i++) hd->Lines[i]=NULL;
  999.  
  1000.  j=LENGTH(num);
  1001.  CacheSeek(hd,TOFFSET(num),OFFSET_BEGINNING);
  1002.  CacheRead(hd,hd->Memory,j);
  1003.  
  1004.  i=0;
  1005.  while(i<j)
  1006.  {
  1007.   hd->Lines[hd->LineCount]=&hd->Memory[i];
  1008.   i+=(strlen(&hd->Memory[i])+1);
  1009.   hd->LineCount++;
  1010.  } 
  1011.  
  1012.  ShowPart(hd,0);
  1013.  
  1014.  if(hd->LineCount>hd->Rows)
  1015.    hd->PropBody=hd->LineCount-hd->Rows;
  1016.  else
  1017.    hd->PropBody=1;
  1018.  NewProp(hd,hd->PropBody);
  1019.  WindowToFront(hd->TextWindow);
  1020. }
  1021.  
  1022.  
  1023. VOID ShowPart(hd,part)
  1024.  struct HelpData *hd;
  1025.  UWORD            part;
  1026. {
  1027.  UBYTE          s[6];
  1028.  REGISTER BYTE  test;
  1029.  REGISTER UWORD i,j,k;
  1030.  
  1031.  if(part==hd->CurrentLine) return;
  1032.  
  1033.  if(!(hd->LineCount<=hd->Rows))
  1034.   {
  1035.    if(part>(hd->LineCount-hd->Rows)) part=hd->LineCount-hd->Rows;
  1036.  
  1037.    /*  part            = Zeile, ab der gelistet werden soll
  1038.        hd->CurrentLine = Zeile, ab der gelistet wird          */
  1039.  
  1040.    if(part>hd->CurrentLine)
  1041.      { test=3; if(part-hd->CurrentLine>=hd->Rows) test=1; }
  1042.    else if(part<hd->CurrentLine)
  1043.      { test=4; if(hd->CurrentLine-part>=hd->Rows) test=1; }
  1044.    else if(part==hd->CurrentLine)
  1045.      { test=1; }
  1046.  
  1047.    switch(test)
  1048.     {
  1049.      case 1:
  1050.        hd->CurrentLine=part;
  1051.        ConWrite(hd,"\f");
  1052.        for(i=part;i<part+hd->Rows;i++)
  1053.         {
  1054.          ConWrite(hd,hd->Lines[i]);
  1055.          ConWrite(hd,"\n");
  1056.         }
  1057.       break;
  1058.      case 3:
  1059.        j=part-hd->CurrentLine;
  1060.        k=hd->CurrentLine+hd->Rows;
  1061.        for(i=k;i<(k+j);i++)
  1062.         {
  1063.          ConWrite(hd,hd->Lines[i]);
  1064.          ConWrite(hd,"\n");
  1065.         }
  1066.        hd->CurrentLine+=j;
  1067.       break;
  1068.      case 4:
  1069.        j=hd->CurrentLine-part;
  1070.        k=hd->CurrentLine;
  1071.        ConWrite(hd,"\x9b");
  1072.        ConWrite(hd,"H");
  1073.        for(i=(k-j);i<k;i++)
  1074.         {
  1075.          ConWrite(hd,"\x9b");
  1076.          ConWrite(hd,"L");
  1077.          ConWrite(hd,hd->Lines[i]);
  1078.          ConWrite(hd,"\n");
  1079.         }
  1080.        sprintf(&s,"%ldH",(hd->Rows+1));
  1081.        ConWrite(hd,"\x9b");
  1082.        ConWrite(hd,&s);
  1083.        ConWrite(hd,"\x9b");
  1084.        ConWrite(hd,"M");
  1085.        hd->CurrentLine-=j;
  1086.       break;
  1087.     }
  1088.   }
  1089.  else
  1090.   {
  1091.    ConWrite(hd,"\f");
  1092.    for(i=0;i<hd->LineCount;i++)
  1093.     {
  1094.      ConWrite(hd,hd->Lines[i]);
  1095.      ConWrite(hd,"\n");
  1096.     }
  1097.   }
  1098. }
  1099.  
  1100.  
  1101. VOID RemIndexGadgets(hd)
  1102.  struct HelpData *hd;
  1103. {
  1104.  UBYTE          i;
  1105.  struct Gadget *gad;
  1106.  
  1107.  for(i=0;i<64;i++)
  1108.   {
  1109.    gad=hd->IndexGadgets[i];
  1110.    if(gad!=NULL)
  1111.     {
  1112.      RemoveGadget(hd->IndexWindow,gad);
  1113.      hd->IndexGadgets[i]=NULL;
  1114.      hd->IndexGadgetPages[i]=0;
  1115.     }
  1116.   }
  1117.  if(hd->IndexWindow->UserData!=NULL)
  1118.   {
  1119.    FreeRemember(&hd->IndexWindow->UserData,TRUE);
  1120.    hd->IndexWindow->UserData=NULL;
  1121.   }
  1122.  SetAPen(hd->IndexRastPort,0);
  1123.  RectFill(hd->IndexRastPort,0,0,582,210);
  1124. }
  1125.  
  1126.  
  1127. VOID NewProp(hd,v)
  1128.  struct HelpData *hd;
  1129.  UWORD            v;
  1130. {
  1131.  
  1132.  ModifyProp(hd->PropGadget,hd->MainWindow,NULL,
  1133.             AUTOKNOB|PROPBORDERLESS|FREEVERT,0,0,0,65535/v);
  1134. }
  1135.  
  1136.  
  1137.  
  1138. struct MenuStrip
  1139. {
  1140.  struct Window   *Window;
  1141.  struct TextAttr  TextAttr;
  1142.  UBYTE            FrontPen;
  1143.  UBYTE            BackPen;
  1144.  
  1145.  struct Menu     *LastMenu;
  1146.  struct MenuItem *LastItem;
  1147.  struct MenuItem *LastSubItem;
  1148.  struct Remember *Remember;
  1149. };
  1150.  
  1151. /* MenuStrip Grundstruktur erstellen */
  1152. struct MenuStrip *BuildMenuStrip(win,fp,bp)
  1153.  struct Window   *win;
  1154.  UWORD            fp,bp;
  1155. {
  1156.  register struct MenuStrip *ms;
  1157.  register struct RastPort  *rp;
  1158.  
  1159.  ms=AllocMem(sizeof(struct MenuStrip),MEMF_CLEAR|MEMF_PUBLIC);
  1160.  if(ms!=NULL)
  1161.   {
  1162.    ms->Window=win;
  1163.    rp=win->RPort;
  1164.    ms->TextAttr.ta_Name=rp->Font->tf_Message.mn_Node.ln_Name;
  1165.    ms->TextAttr.ta_YSize=rp->Font->tf_YSize;
  1166.    ms->TextAttr.ta_Flags=rp->Font->tf_Flags;
  1167.    ms->TextAttr.ta_Style=rp->AlgoStyle;
  1168.    ms->FrontPen=fp;
  1169.    ms->BackPen=bp;
  1170.   }
  1171.  return(ms);
  1172. }
  1173.  
  1174. struct Menu *AddMenu(ms,x,w,name)
  1175.  struct MenuStrip *ms;
  1176.  UWORD             x,w;
  1177.  UBYTE            *name;
  1178. {
  1179.  register struct Menu *me;
  1180.  
  1181.  me=AllocRemember(&ms->Remember,sizeof(struct Menu),MEMF_CLEAR|MEMF_PUBLIC);
  1182.  if(me!=NULL)
  1183.   {
  1184.    me->LeftEdge=x;
  1185.    me->TopEdge=0;
  1186.    me->Width=w;
  1187.    me->Height=10;
  1188.    me->Flags=MENUENABLED;
  1189.    me->MenuName=name;
  1190.    me->NextMenu=ms->LastMenu;
  1191.    ms->LastMenu=me;
  1192.    ms->LastItem=NULL;
  1193.    ms->LastSubItem=NULL;
  1194.   }
  1195.  return(me);
  1196. }
  1197.  
  1198. struct MenuItem *AddItem(ms,name,w,cmd,enabled,highcomp)
  1199.  struct MenuStrip *ms;
  1200.  UBYTE            *name;
  1201.  UWORD             w;
  1202.  UBYTE             cmd;
  1203.  BOOL              enabled,highcomp;
  1204. {
  1205.  register struct Menu      *me;
  1206.  register struct MenuItem  *mi;
  1207.  register struct IntuiText *it;
  1208.  
  1209.  me=ms->LastMenu;
  1210.  if(me!=NULL)
  1211.   {
  1212.    mi=AllocRemember(&ms->Remember,sizeof(struct MenuItem)+sizeof(struct IntuiText),MEMF_CLEAR|MEMF_PUBLIC);
  1213.    if(mi!=NULL)
  1214.     {
  1215.      it=(ULONG)mi+(ULONG)sizeof(struct MenuItem);
  1216.  
  1217.      if(ms->LastItem!=NULL)
  1218.        mi->TopEdge=ms->LastItem->TopEdge+10;
  1219.      else
  1220.        mi->TopEdge=0;
  1221.      mi->LeftEdge=0;
  1222.      mi->Width=w;
  1223.      mi->Height=10;
  1224.      mi->Flags=ITEMTEXT;
  1225.      if(enabled) mi->Flags |= ITEMENABLED;
  1226.      if(highcomp) mi->Flags |= HIGHCOMP; else mi->Flags |= HIGHNONE;
  1227.      if(cmd!=0)
  1228.       {
  1229.        mi->Flags |= COMMSEQ;
  1230.        mi->Command=cmd;
  1231.       }
  1232.      mi->ItemFill=it;
  1233.      it->LeftEdge=AUTOLEFTEDGE;
  1234.      it->TopEdge=1;
  1235.      it->DrawMode=JAM1;
  1236.      it->FrontPen=ms->FrontPen;
  1237.      it->BackPen=ms->BackPen;
  1238.      it->ITextFont=&ms->TextAttr;
  1239.      it->IText=name;
  1240.      mi->NextItem=ms->LastItem;
  1241.      ms->LastItem=mi;
  1242.      ms->LastSubItem=NULL;
  1243.      me->FirstItem=mi;
  1244.     }
  1245.   }
  1246.  return(mi);
  1247. }
  1248.  
  1249. VOID UseMenuStrip(ms)
  1250.  struct MenuStrip *ms;
  1251. {
  1252.  
  1253.  if(ms->LastMenu!=NULL) SetMenuStrip(ms->Window,ms->LastMenu);
  1254. }
  1255.  
  1256. VOID RemoveMenuStrip(ms,bool)
  1257.  struct MenuStrip *ms;
  1258.  BOOL              bool;
  1259. {
  1260.  ClearMenuStrip(ms->Window);
  1261.  if(ms->Remember!=NULL) FreeRemember(&ms->Remember,TRUE);
  1262.  ms->Remember=NULL;
  1263.  ms->LastMenu=NULL;
  1264.  ms->LastItem=NULL;
  1265.  ms->LastSubItem=NULL;
  1266.  if(bool==TRUE) FreeMem(ms,sizeof(struct MenuStrip));
  1267. }
  1268.  
  1269. UBYTE *GetOpalLine()
  1270. {
  1271.  return((UBYTE *)"·········································································");
  1272. }
  1273.  
  1274. UBYTE *GetOpalLine450()
  1275. {
  1276.  return((UBYTE *)"···············································································································");
  1277. }
  1278.  
  1279. VOID MacFormat(hd,tex,x)
  1280.  struct HelpData *hd;
  1281.  UBYTE           *tex;
  1282.  UWORD            x;
  1283. {
  1284.  REGISTER UWORD i,j,k,l;
  1285.  
  1286.  k=strlen(tex);
  1287.  l=TextLength(hd->MainRastPort,tex,k);
  1288.  if(l>x)
  1289.   {
  1290.    i=0;
  1291.    j=TextLength(hd->MainRastPort,"...",3);
  1292.    l=j;
  1293.    do
  1294.     {
  1295.      j+=TextLength(hd->MainRastPort,&tex[i],1L);
  1296.      i++;
  1297.     } while(j<x);
  1298.    tex[i]=0x00;
  1299.    strcat(tex,"...");
  1300.   }
  1301. }
  1302.  
  1303.  
  1304. VOID MakeMenu(hd)
  1305.  struct HelpData *hd;
  1306. {
  1307.  REGISTER UWORD i,j;
  1308.  
  1309.  RemoveMenuStrip(hd->MenuStrip,FALSE);
  1310.  hd->DateiMenu=AddMenu(hd->MenuStrip,5,150,"Datei");
  1311.  AddItem(hd->MenuStrip,"Einstellunden ändern",300,'E',TRUE,TRUE);
  1312.  AddItem(hd->MenuStrip,"Bedienungshinweise",300,'B',TRUE,TRUE);
  1313.  AddItem(hd->MenuStrip,"Information",300,'I',TRUE,TRUE);
  1314.  AddItem(hd->MenuStrip,GetOpalLine(),300,0,FALSE,FALSE);
  1315.  AddItem(hd->MenuStrip,"Hilfe beenden",300,'Q',TRUE,TRUE);
  1316.  hd->QVMenu=AddMenu(hd->MenuStrip,160,150,"Querverweise");
  1317.  if((hd->Flags==PAGE_TEXT)&&(hd->MenuPageCount>0))
  1318.   {
  1319.    for(i=0;i<hd->MenuPageCount;i++)
  1320.     {
  1321.      if(hd->MenuPages[i]!=2000)
  1322.       {
  1323.        MacFormat(hd,&hd->MenuNames[i],430);
  1324.        AddItem(hd->MenuStrip,&hd->MenuNames[i],450,0,TRUE,TRUE);
  1325.       }
  1326.      else AddItem(hd->MenuStrip,GetOpalLine450(),450,0,FALSE,FALSE);
  1327.     }
  1328.   }
  1329.  else AddItem(hd->MenuStrip,"Nicht verfügbar",300,0,TRUE,FALSE);
  1330.  hd->BilderMenu=AddMenu(hd->MenuStrip,315,150,"Bilder");
  1331.  if(hd->MenuPicCount>0)
  1332.   {
  1333.    for(i=0;i<hd->MenuPicCount;i++)
  1334.     {
  1335.      if(hd->MenuPics[i]!=200)
  1336.       {
  1337.        sprintf(&hd->MenuPicNames[i],"Abbildung #%ld",hd->MenuPics[i]+1);
  1338.        AddItem(hd->MenuStrip,&hd->MenuPicNames[i],300,0,TRUE,TRUE);
  1339.       }
  1340.      else AddItem(hd->MenuStrip,GetOpalLine(),300,0,FALSE,FALSE);
  1341.     }
  1342.   }
  1343.  else AddItem(hd->MenuStrip,"Nicht verfügbar",300,0,TRUE,FALSE);
  1344.  UseMenuStrip(hd->MenuStrip);
  1345.  ActivateWindow(hd->MainWindow);
  1346. }
  1347.  
  1348.  
  1349. UBYTE *String[]=
  1350. {
  1351.  "",
  1352.  "\x9b1;33;40m\x9b4;33;40mDie Bedienung des Online-Hilfesystems\x9b0;33;40m",
  1353.  "",
  1354.  "",
  1355.  "",
  1356.  "\x9b4;33;40mDie Auswahl von Seiten\x9b0;33;40m",
  1357.  "",
  1358.  "",
  1359.  "Beim Aufruf des Hilfesystems wird zuerst der Hauptindex geladen. Durch",
  1360.  "Klicken auf die Gadgets im Index gelangt man zu den entsprechenden",
  1361.  "Seiten.",
  1362.  "",
  1363.  "Am unteren Bildschirmrand befindet sich mindestens ein Gadget; maximal",
  1364.  "jedoch sechs. Mit ihnen kann zur nächsten bzw. vorhergehenden Seite ge-",
  1365.  "wechselt werden oder die zuletzt angezeigten Seiten erneut sichten.",
  1366.  "",
  1367.  "Gadget-Positionen und ihre Funktionen",
  1368.  "",
  1369.  "[«] [......] [......] [......] [......] [»]",
  1370.  " |     |        |        |        |      |",
  1371.  " |     |        |        |        |      +-- Umkehrung von \"«\"",
  1372.  " |     |        |        |        +-- nächste Indexseite",
  1373.  " |     |        |        +-- nächste Textseite",
  1374.  " |     |        +-- vorhergehende Textseite",
  1375.  " |     +-- vorhergehende Indexseite",
  1376.  " +-- zuletzt gezeigte Seite sichten",
  1377.  "",
  1378.  "",
  1379.  "",
  1380.  "\x9b4;33;40mDie Seitentypen\x9b0;33;40m",
  1381.  "",
  1382.  "",
  1383.  "Indexseiten:",
  1384.  "",
  1385.  "Auf Indexseiten befinden sich Gadgets, die zu den entsprechenden Text-",
  1386.  "seiten führen.",
  1387.  "",
  1388.  "",
  1389.  "Textseiten:",
  1390.  "",
  1391.  "Auf diesen Seiten stehen die Hilfstexte. Ist der Text größer als der",
  1392.  "im Textfenster zur Verfügung stehende Platz, so läßt sich der Text-",
  1393.  "ausschnitt mit dem Proportional-Gadget am rechten Bildschirmrand ver-",
  1394.  "schieben.",
  1395.  "Besitzt die Seite Querverweise auf andere Seiten, so sind diese im",
  1396.  "Menü \"Querverweise\" aufgelistet. Durch Anwahl des entsprechenden",
  1397.  "Menüpunktes wird die Seite geladen.",
  1398.  "Gleiches gilt für Bilder und Diagramme im Menü \"Bilder\".",
  1399.  "",
  1400.  "",
  1401.  "",
  1402.  "\x9b4;33;40mDas Datei-Menü\x9b0;33;40m",
  1403.  "",
  1404.  "",
  1405.  "Der Menüpunkt \"Einstellungen ändern\"",
  1406.  "",
  1407.  "Hier lassen sich die Grundeinstellungen des Hilfesystems ändern:",
  1408.  "",
  1409.  "Cache-Modus: Die Hilfedatei wird beim Start komplett in den Haupt-",
  1410.  "             speicher geladen. Bei Systemen mit wenig Speicher kann",
  1411.  "             der Modus ausgeschaltet werden. Bei jeder neuen Seite",
  1412.  "             wird dann vom Datenträger nachgeladen.",
  1413.  "",
  1414.  "PAL-Modus: Es wird statt des amerikanischen NTSC-Videosystems",
  1415.  "           (600x200 Pixel) das europäische PAL-System (640x256 Pixel)",
  1416.  "           benutzt."
  1417.  "",
  1418.  "Seitennummern: Zusätzlich zum Seitentitel wird auch die Seitennummer",
  1419.  "               angezeigt. Über diese Nummern läuft die gesamte Seiten-",
  1420.  "               verwaltung; deshalb kann diese Funktion beim Einbau der",
  1421.  "               Online-Hilfe in eigene Programme sinnvoll sein. Für den",
  1422.  "               normalen Gebrauch werden diese Nummern nicht benötigt,",
  1423.  "               da die Seitenauswahl über die Maus läuft.",
  1424.  "",
  1425.  "SN-Eingabe: Ist diese Funktion eingeschaltet, so kann eine Seitennummer",
  1426.  "            direkt eingegeben werden: Wurde die erste Ziffer gedrückt,",
  1427.  "            so erscheint rechts oben neben dem Index-Gadget statt der",
  1428.  "            Seitentitelanzeige die Nummerneingabeanzeige. Die direkte",
  1429.  "            Seiteneingabe ist wie auch die Seitennummernanzeige nur",
  1430.  "            für Entwicklungszwecke gedacht und wird deshalb bei Nor-",
  1431.  "            malgebrauch nicht benötigt.",
  1432.  "",
  1433.  "",
  1434.  "Der Menüpunkt \"Bedienungshinweise\"",
  1435.  "",
  1436.  "Hiermit wird dieser Text angezeigt.",
  1437.  "",
  1438.  "",
  1439.  "Der Menüpunkt \"Information\"",
  1440.  "",
  1441.  "Hiermit werden Informationen über das Hilfesystem, die Version und",
  1442.  "den noch freien Speicher im Amiga und auf einer eventuell vorhan-",
  1443.  "denen PC/AT-Brückenkarte angezeigt.",
  1444.  "",
  1445.  "",
  1446.  "Der Menüpunkt \"Hilfe beenden\"",
  1447.  "",
  1448.  "Hiermit wird das Hilfesystem geschlossen und in das Anwendungs-",
  1449.  "programm zurückgekehrt.",
  1450.  "",
  1451.  "",
  1452.  "",
  1453.  "\x9b4;33;40mDas Querverweise-Menü\x9b0;33;40m",
  1454.  "",
  1455.  "In diesem Menü stehen Querverweise auf andere, zum Thema relevante",
  1456.  "Seiten. Sie können durch Anwahl des entsprechendes Menüpunktes",
  1457.  "gesichtet werden. Querverweise sind nicht auf allen Seiten.",
  1458.  "",
  1459.  "",
  1460.  "",
  1461.  "\x9b4;33;40mDas Bilder-Menü\x9b0;33;40m",
  1462.  "",
  1463.  "In diesem Menü befinden sich Bilder, die durch Anwahl der Menüpunkte",
  1464.  "angezeigt werden. Bilder sind, wie Querverweise, nicht auf allen",
  1465.  "Seiten.",
  1466.  NULL
  1467. };
  1468.  
  1469.  
  1470. VOID Hinweise(hd)
  1471.  struct HelpData *hd;
  1472. {
  1473.  REGISTER UWORD i;
  1474.  
  1475.  WindowToFront(hd->TextWindow);
  1476.  RemIndexGadgets(hd);
  1477.  hd->Flags=PAGE_TEXT;
  1478.  hd->Page=1001;
  1479.  hd->CurrentLine=0xFFFF;
  1480.  i=0;
  1481.  while(String[i]!=NULL)
  1482.   {
  1483.    hd->Lines[i]=String[i];
  1484.    i++;
  1485.   }
  1486.  hd->LineCount=i;
  1487.  for( ;i<2000;i++) hd->Lines[i]=NULL;
  1488.  ShowPart(hd,0);
  1489.  hd->PropBody=hd->LineCount-hd->Rows;
  1490.  NewProp(hd,hd->PropBody);
  1491.  WindowToFront(hd->TextWindow);
  1492. }
  1493.  
  1494.  
  1495. VOID Prefs(hd)
  1496.  struct HelpData *hd;
  1497. {
  1498.  REGISTER UWORD                i,j;
  1499.  register struct FileHandle   *fh;
  1500.  register struct Window       *win;
  1501.  register struct RastPort     *rp;
  1502.  register struct Gadget       *g1,*g2,*g3,*g4;
  1503.  static struct NewWindow PrefsWindowDef=
  1504.   {
  1505.    75,75,450,90,
  1506.    0,1,
  1507.    CLOSEWINDOW,
  1508.    ACTIVATE|WINDOWDRAG|WINDOWCLOSE,
  1509.    NULL,NULL,"Online-Hilfe - Einstellungen",NULL,NULL,
  1510.    10,16,640,256,
  1511.    CUSTOMSCREEN
  1512.   };
  1513.  
  1514.  PrefsWindowDef.Screen=hd->Screen;
  1515.  win=OpenWindow(&PrefsWindowDef);
  1516.  if(win!=NULL)
  1517.   {
  1518.    win->UserData=NULL;
  1519.    rp=win->RPort;
  1520.    SetFont(rp,hd->OpalFont);
  1521.    if(hd->OHPrefs.Cache==0)
  1522.      g1=CreateNToggleGadget(win,15,15,410,12,"Cache für Hilfedatei anlegen",1);
  1523.    else
  1524.      g1=CreateSToggleGadget(win,15,15,410,12,"Cache für Hilfedatei anlegen",1);
  1525.    if(hd->OHPrefs.PAL==0)
  1526.      g4=CreateNToggleGadget(win,15,30,410,12,"Europäisches PAL-Videosystem",4);
  1527.    else
  1528.      g4=CreateSToggleGadget(win,15,30,410,12,"Europäisches PAL-Videosystem",4);
  1529.    SetAPen(rp,3);
  1530.    WriteText(rp,20,52,"Spezialeinstellungen:");
  1531.    if(hd->OHPrefs.Numbers==0)
  1532.      g2=CreateNToggleGadget(win,15,57,410,12,"Anzeige mit Seitennummern",2);
  1533.    else
  1534.      g2=CreateSToggleGadget(win,15,57,410,12,"Anzeige mit Seitennummern",2);
  1535.    if(hd->OHPrefs.NumInput==0)
  1536.      g3=CreateNToggleGadget(win,15,72,410,12,"Direkte Seitennummereingabe",3);
  1537.    else
  1538.      g3=CreateSToggleGadget(win,15,72,410,12,"Direkte Seitennummereingabe",3);
  1539.    WaitPort(win->UserPort);
  1540.    ReplyMsg(GetMsg(win->UserPort));
  1541.    if(g1->Flags & SELECTED) hd->OHPrefs.Cache=1; else hd->OHPrefs.Cache=0;
  1542.    if(g2->Flags & SELECTED) hd->OHPrefs.Numbers=1; else hd->OHPrefs.Numbers=0;
  1543.    if(g3->Flags & SELECTED) hd->OHPrefs.NumInput=1; else hd->OHPrefs.NumInput=0;
  1544.    if(g4->Flags & SELECTED) hd->OHPrefs.PAL=1; else hd->OHPrefs.PAL=0;
  1545.    DeleteStdWindow(win);
  1546.    fh=Open(HelpName,MODE_NEWFILE);
  1547.    if(fh!=NULL)
  1548.     {
  1549.      Write(fh,&hd->OHPrefs,sizeof(struct OHPrefs));
  1550.      Close(fh);
  1551.     }
  1552.   }
  1553. }
  1554.  
  1555.  
  1556. LONG CacheRead(hd,mem,len)
  1557.  struct HelpData *hd;
  1558.  UBYTE           *mem;
  1559.  ULONG            len;
  1560. {
  1561.  
  1562.  if(hd->CacheOn==0)
  1563.   {
  1564.    return(Read(hd->HelpFile,mem,len));
  1565.   }
  1566.  
  1567.  CopyMem(&hd->CacheMemory[hd->CachePos],mem,len);
  1568.  hd->CachePos+=len;
  1569.  return(len);
  1570. }
  1571.  
  1572.  
  1573. LONG CacheSeek(hd,pos,offset)
  1574.  struct HelpData *hd;
  1575.  LONG             pos;
  1576.  LONG             offset;
  1577. {
  1578.  
  1579.  if(hd->OHPrefs.Cache==0)
  1580.   {
  1581.    return(Seek(hd->HelpFile,pos,offset));
  1582.   }
  1583.  
  1584.  hd->CacheLastPos=hd->CachePos;
  1585.  switch(offset)
  1586.   {
  1587.    case OFFSET_BEGINNING:
  1588.      hd->CachePos=pos;
  1589.     break;
  1590.    case OFFSET_END:
  1591.      hd->CachePos=hd->CacheSize+pos;
  1592.     break;
  1593.   }
  1594.  return(hd->CacheLastPos);
  1595. }
  1596.  
  1597.  
  1598. VOID LoadAPicture(hd,num)
  1599.  struct HelpData *hd;
  1600.  UBYTE            num;
  1601. {
  1602.  LONG                        o;
  1603.  ULONG                       size;
  1604.  UBYTE                       byte;
  1605.  REGISTER UBYTE             *mem;
  1606.  register struct FileHandle *fh;
  1607.  
  1608.  o=hd->Picture[num];
  1609.  if(o!=NULL)
  1610.   {
  1611.    CacheSeek(hd,o,OFFSET_BEGINNING);
  1612.    CacheRead(hd,&byte,1L);
  1613.    CacheRead(hd,&size,4L);
  1614.    if(byte==0)
  1615.     {
  1616.      CacheRead(hd,&hd->String,199);
  1617.      hd->String[199]=0x00;
  1618.      ShowPicture(&hd->String);
  1619.     }
  1620.    else
  1621.     {
  1622.      if(hd->CacheOn!=0)
  1623.       {
  1624.        DisplayPicture(&hd->CacheMemory[hd->CachePos],size);
  1625.       }
  1626.      else
  1627.       {
  1628.        mem=AllocMem(size,MEMF_CLEAR|MEMF_PUBLIC);
  1629.        if(mem!=NULL)
  1630.         {
  1631.          CacheRead(hd,mem,size);
  1632.          DisplayPicture(mem,size);
  1633.          FreeMem(mem,size);
  1634.         }
  1635.       }
  1636.     }
  1637.   }
  1638. }
  1639.  
  1640.  
  1641. struct BMHD
  1642. {
  1643.  UWORD w,h,x,y;
  1644.  UBYTE BitPlanes;
  1645.  UBYTE Masking;
  1646.  UBYTE Compression;
  1647.  UBYTE pad;
  1648.  UWORD TransCol;
  1649.  UBYTE XA,YA;
  1650.  UWORD Width,Height;
  1651. };
  1652.  
  1653. struct ColReg
  1654. {
  1655.  UBYTE Red;
  1656.  UBYTE Green;
  1657.  UBYTE Blue;
  1658. };
  1659.  
  1660. struct CAMG
  1661. {
  1662.  UWORD pad;
  1663.  UWORD ViewModes;
  1664. };
  1665.  
  1666. struct CRNG
  1667. {
  1668.  UWORD  pad;
  1669.  UWORD  rate;
  1670.  UWORD  active;
  1671.  UBYTE  low,high;
  1672. };
  1673.  
  1674. struct RInfo
  1675. {
  1676.  UBYTE *Memory;
  1677.  ULONG  Pos;
  1678.  ULONG  Max;
  1679. };
  1680.  
  1681. ULONG Lesen(ri,m,l)
  1682.  struct RInfo *ri;
  1683.  UBYTE        *m;
  1684.  ULONG         l;
  1685. {
  1686.  if((ri->Pos+l)>ri->Max) l=(ri->Max-ri->Pos);
  1687.  CopyMem(&ri->Memory[ri->Pos],m,l);
  1688.  ri->Pos+=l;
  1689.  return(l);
  1690. }
  1691.  
  1692. VOID Jump(ri,l)
  1693.  struct RInfo *ri;
  1694.  ULONG         l;
  1695. {
  1696.  if((ri->Pos+l)>ri->Max) l=(ri->Max-ri->Pos);
  1697.  ri->Pos+=l;
  1698. }
  1699.  
  1700. UBYTE ColorCount[]={1,2,4,8,16,32,32,32,32};
  1701.  
  1702. BOOL DisplayPicture(mem,len)
  1703.  UBYTE *mem;
  1704.  LONG   len;
  1705. {
  1706.  struct NewScreen        ns;
  1707.  UBYTE                   Buffer[300];
  1708.  ULONG                   l;
  1709.  BOOL                    BMHDFlag,BODYFlag,CMAPFlag,CAMGFlag,CRNGFlag,FoundChunk;
  1710.  ULONG                   ChunkLen;
  1711.  REGISTER UWORD          BytesPerRow,bpr,y,ByteCount,h,i;
  1712.  REGISTER UBYTE          b;
  1713.  ULONG                   dest;
  1714.  register struct Screen *scr;
  1715.  struct BMHD             bmhd;
  1716.  struct CAMG             camg;
  1717.  struct CRNG             crng;
  1718.  struct ColReg           Farben[32];
  1719.  UWORD                   AnzFarben;
  1720.  struct ColReg           Farbe;
  1721.  struct RInfo           *fh;
  1722.  struct RInfo            ri;
  1723.  
  1724.  ri.Memory=mem;
  1725.  ri.Pos=0;
  1726.  ri.Max=len;
  1727.  fh=&ri;
  1728.  
  1729.  Lesen(fh,&Buffer,12); 
  1730.  
  1731.  if(strncmp(&Buffer[0],"FORM",4)!=0)
  1732.   { InfoRequest("Bild hat kein IFF-Format!");
  1733.      return(FALSE); }
  1734.  if(strncmp(&Buffer[8],"ILBM",4)!=0)
  1735.   { InfoRequest("Bild hat kein ILBM-Format!");
  1736.    return(FALSE); }
  1737.  
  1738.  BMHDFlag=FALSE;
  1739.  BODYFlag=FALSE;
  1740.  CAMGFlag=FALSE;
  1741.  CMAPFlag=FALSE;
  1742.  CRNGFlag=FALSE;
  1743.  
  1744. Loop:
  1745.  FoundChunk=FALSE;
  1746.  l=Lesen(fh,&Buffer,8);
  1747.  if((l==0)||((BMHDFlag==TRUE)&&(BODYFlag==TRUE)&&(CMAPFlag==TRUE)))
  1748.   {
  1749.    if((BMHDFlag==TRUE)&&(BODYFlag==TRUE)&&(CMAPFlag==TRUE))
  1750.     {
  1751.      ShowTitle(scr,FALSE);
  1752.  
  1753.      if(CRNGFlag==TRUE)
  1754.       {
  1755.        if(crng.active!=0)
  1756.         {
  1757.          h=crng.rate/273;
  1758.          if(h==0) h=1;
  1759.          y=50/h;
  1760.          while((MouseButton())==0)
  1761.           {
  1762.            Farbe.Red=Farben[crng.low].Red;
  1763.            Farbe.Green=Farben[crng.low].Green;
  1764.            Farbe.Blue=Farben[crng.low].Blue;
  1765.            for(i=crng.low;i<crng.high;i++)
  1766.             {
  1767.              Farben[i].Red=Farben[i+1].Red;
  1768.              Farben[i].Green=Farben[i+1].Green;
  1769.              Farben[i].Blue=Farben[i+1].Blue;
  1770.             }
  1771.            Farben[crng.high].Red=Farbe.Red;
  1772.            Farben[crng.high].Green=Farbe.Green;
  1773.            Farben[crng.high].Blue=Farbe.Blue;
  1774.            for(i=crng.low;i<crng.high;i++)
  1775.             {
  1776.              SetRGB4(&scr->ViewPort,i,Farben[i].Red,
  1777.                                       Farben[i].Green,
  1778.                                       Farben[i].Blue);
  1779.             }
  1780.            Delay(y);
  1781.           }
  1782.         }
  1783.       }
  1784.      else
  1785.       {
  1786.        while((MouseButton())==0)
  1787.          Delay(5);
  1788.       }
  1789.  
  1790.      CloseScreen(scr);
  1791.      return(TRUE);
  1792.     }
  1793.    else
  1794.     {
  1795.      if((BMHDFlag==TRUE)||(BODYFlag==TRUE)||(CMAPFlag==TRUE))
  1796.       {
  1797.        if(BMHDFlag==FALSE) InfoRequest("Bild hat keinen BMHD-Chunk!");
  1798.        else if(BODYFlag==FALSE) InfoRequest("Bild hat keinen BODY-Chunk!");
  1799.        else if(CMAPFlag==FALSE) InfoRequest("Bild hat keinen CMAP-Chunk!");
  1800.        if(scr!=NULL) CloseScreen(scr);
  1801.        return(FALSE);
  1802.       }
  1803.     }
  1804.   }
  1805.  ChunkLen=Buffer[4]*16777216+Buffer[5]*65536+Buffer[6]*256+Buffer[7];
  1806.  if(strncmp(&Buffer,"BMHD",4)==0)
  1807.   {
  1808.    Lesen(fh,&bmhd,ChunkLen);
  1809.    if(bmhd.Compression>1)
  1810.     {
  1811.      InfoRequest("Unbekannte Kompressionsmethode!");
  1812.      return(FALSE);
  1813.     }
  1814.    ns.LeftEdge   = 0;
  1815.    ns.TopEdge    = 0;
  1816.    ns.Width      = bmhd.Width;
  1817.    ns.Height     = bmhd.Height;
  1818.    ns.Depth      = bmhd.BitPlanes;
  1819.    ns.DetailPen  = 1;
  1820.    ns.BlockPen   = 0;
  1821.    if(CAMGFlag==TRUE)
  1822.     {
  1823.      ns.ViewModes = camg.ViewModes;
  1824.     }
  1825.    else
  1826.     {
  1827.      if(ns.Width>320) ns.ViewModes |= HIRES;
  1828.      if(ns.Height>256) ns.ViewModes |= LACE;
  1829.     }
  1830.    ns.Type         = CUSTOMSCREEN;
  1831.    ns.Font         = NULL;
  1832.    ns.DefaultTitle = "Ende mit Mausklick";
  1833.    ns.Gadgets      = NULL;
  1834.    ns.CustomBitMap = NULL;
  1835.    scr=OpenScreen(&ns);
  1836.    if(scr==NULL)
  1837.     {
  1838.      InfoRequest("Kann Screen nicht öffnen!");
  1839.      return(FALSE);
  1840.     }
  1841.    BytesPerRow=bmhd.Width/8;
  1842.    bpr=(bmhd.w+1)/8;
  1843.    h=bmhd.h+1;
  1844.    BMHDFlag=TRUE;
  1845.    FoundChunk=TRUE;
  1846.   }
  1847.  if(strncmp(&Buffer,"CMAP",4)==0)
  1848.   {
  1849.    if(BMHDFlag==FALSE)
  1850.     { InfoRequest("BMHD-Chunk muß vor CMAP-Chunk stehen!");
  1851.       return(FALSE); }
  1852.  
  1853.    AnzFarben=ColorCount[bmhd.BitPlanes];
  1854.    for(i=0;i<AnzFarben;i++)
  1855.     {
  1856.      Lesen(fh,&Farbe,3);
  1857.      Farben[i].Red=Farbe.Red>>4;
  1858.      Farben[i].Green=Farbe.Green>>4;
  1859.      Farben[i].Blue=Farbe.Blue>>4;
  1860.      SetRGB4(&scr->ViewPort,i,Farben[i].Red,
  1861.                               Farben[i].Green,
  1862.                               Farben[i].Blue);
  1863.     }
  1864.    CMAPFlag   = TRUE;
  1865.    FoundChunk = TRUE;
  1866.   }
  1867.  if(strncmp(&Buffer,"BODY",4)==0)
  1868.   {
  1869.    if(BMHDFlag==FALSE)
  1870.     { InfoRequest("BMHD-Chunk muß vor BODY-Chunk stehen!");
  1871.       return(FALSE); }
  1872.  
  1873.    for(y=0;y<h;y++)
  1874.     {
  1875.      for(b=0;b<bmhd.BitPlanes;b++)
  1876.       {
  1877.        ByteCount=0;
  1878.        dest=(ULONG)((ULONG)(scr->RastPort.BitMap->Planes[b])+y*BytesPerRow+bmhd.x);
  1879.        if(bmhd.Compression==0)
  1880.         {
  1881.          Lesen(fh,dest,bpr);
  1882.         }
  1883.        else
  1884.         {
  1885.          while(ByteCount<bpr)
  1886.           {
  1887.            Lesen(fh,&Buffer[0],1);
  1888.            if(Buffer[0]<128)
  1889.             {
  1890.              Lesen(fh,dest+(ULONG)ByteCount,Buffer[0]+1);
  1891.              ByteCount += Buffer[0]+1;
  1892.             }
  1893.            if(Buffer[0]>128)
  1894.             {
  1895.              Lesen(fh,&Buffer[1],1);
  1896.              for(i=ByteCount;i<(ByteCount+(257-Buffer[0]));i++)
  1897.                { *((UBYTE *)dest+(UBYTE *)i)=Buffer[1]; }
  1898.              ByteCount += 257-Buffer[0];
  1899.             }
  1900.           }
  1901.         }
  1902.       }
  1903.     }
  1904.    BODYFlag   = TRUE;
  1905.    FoundChunk = TRUE;
  1906.   }
  1907.  if(strncmp(&Buffer,"CAMG",4)==0)
  1908.   {
  1909.    Lesen(fh,&camg,ChunkLen);
  1910.    if(BMHDFlag==FALSE)
  1911.     { InfoRequest("BMHD-Chunk muß vor CAMG-Chunk stehen!");
  1912.       return(FALSE); }
  1913.    scr->ViewPort.Modes=camg.ViewModes;
  1914.    RemakeDisplay();
  1915.    CAMGFlag   = TRUE;
  1916.    FoundChunk = TRUE;
  1917.   }
  1918.  if(strncmp(&Buffer,"CRNG",4)==0)
  1919.   {
  1920.    if(CRNGFlag==FALSE)
  1921.     {
  1922.      Lesen(fh,&crng,ChunkLen);
  1923.      CRNGFlag   = TRUE;
  1924.      FoundChunk = TRUE;
  1925.     }
  1926.   }
  1927.  if(FoundChunk==FALSE)
  1928.   {
  1929.    Jump(fh,ChunkLen);
  1930.    if(ChunkLen & 1) Jump(fh,1);
  1931.   }
  1932.  goto Loop;
  1933. }
  1934.  
  1935.  
  1936. BOOL ShowPicture(name)
  1937.  UBYTE *name;
  1938. {
  1939.  REGISTER UBYTE             *mem;
  1940.  REGISTER ULONG              size;
  1941.  register struct FileHandle *fh;
  1942.  
  1943.  fh=Open(name,MODE_OLDFILE);
  1944.  if(fh!=NULL)
  1945.   {
  1946.    Seek(fh,0,OFFSET_END);
  1947.    size=Seek(fh,0,OFFSET_BEGINNING);
  1948.    mem=AllocMem(size,MEMF_CLEAR|MEMF_PUBLIC);
  1949.    if(mem!=NULL)
  1950.     {
  1951.      DisplayPicture(mem,size);
  1952.      FreeMem(mem,size);
  1953.     }
  1954.   }
  1955.  else return(FALSE);
  1956.  return(TRUE);
  1957. }
  1958.  
  1959. #asm
  1960.    public _MouseButton
  1961. _MouseButton:
  1962.    btst #6,$bfe001
  1963.    bne 1$
  1964.    move.l #1,d0
  1965.    rts
  1966. 1$:
  1967.    clr.l d0
  1968.    rts
  1969. #endasm
  1970.  
  1971.  
  1972. VOID AddPage(hd)
  1973.  struct HelpData *hd;
  1974. {
  1975.  REGISTER UBYTE i;
  1976.  
  1977.  hd->ShowLastPageBack=0;
  1978.  hd->LastPageSelect=hd->LastPagePos;
  1979.  if(hd->LastPagePos<PAGE_MEMORY)
  1980.   {
  1981.    hd->LastPage[hd->LastPagePos]=hd->Page;
  1982.    hd->LastPagePos++;
  1983.   }
  1984.  else
  1985.   {
  1986.    for(i=0;i<PAGE_MEMORY;i++)
  1987.     {
  1988.      hd->LastPage[i]=hd->LastPage[i+1];
  1989.     }
  1990.    hd->LastPage[PAGE_MEMORY-1]=hd->Page;
  1991.    hd->LastPageSelect=PAGE_MEMORY-1;
  1992.   }
  1993. }
  1994.  
  1995.